#include "data.hpp"
#include <sstream>

namespace aod {
bool TableVideo::Insert(const Json::Value &video) {
    std::stringstream ss;
    ss << "INSERT INTO tb_video (name, info, video, image) VALUES (";
    ss << "'" << video["name"].asString() << "', ";
    ss << "'" << video["info"].asString() << "', ";
    ss << "'" << video["video"].asString() << "', ";
    ss << "'" << video["image"].asString() << "');";

    std::string sql = ss.str();

    std::unique_lock<std::mutex> lock(_mutex);

    // 调用 C API
    int ret = mysql_query(_mysql, sql.c_str());
    if(ret != 0) {
        std::cerr << "TableVideo::Insert failed! SQL:" << sql << std::endl;
        std::cerr << "Error: " << mysql_error(_mysql) << std::endl;
        return false;
    }

    return true;
}

// 实现selectAll函数
bool TableVideo::SelectAll(Json::Value *videos) {
    // 1. 准备 sql
    std::string sql = "SELECT * FROM tb_video;";

    // 2. 加锁，执行
    std::unique_lock<std::mutex> lock(_mutex);
    int ret = mysql_query(_mysql, sql.c_str());
    if(ret != 0) {
        std::cerr << "TableVideo::SelectAll failed! Error: " 
                  << mysql_error(_mysql) << std::endl;
        return false;
    }

    // 3. 封装 C API 的结果集
    MYSQL_RES* res = mysql_store_result(_mysql);
    if(res == NULL) {
        std::cerr << "mysql_stort_result failed! Error: "
                  << mysql_error(_mysql) << std::endl;
        return false;
    }

    // 4. 获取行数和列数
    int num_rows = mysql_num_rows(res);
    // int num_cols = mysql_num_fields(res);

    // 5. 遍历结果
    for(int i = 0; i < num_rows; i++) {
        MYSQL_ROW row = mysql_fetch_row(res);

        // 6. 将 C API（char**）转换为 C++（Json::Value）
        Json::Value video_json;
        video_json["id"] = std::stoi(row[0]);
        video_json["name"] = row[1];
        video_json["info"] = row[2];
        video_json["video"] = row[3];
        video_json["image"] = row[4];

        // 7. 使用Json::Value 的 append 方法
        videos->append(video_json);
    }
    // 8. 释放掉这个链接
    mysql_free_result(res);
    return true;
}

// 实现DeleteAll函数
bool TableVideo::DeleteAll() {
    std::string sql = "DELETE FROM tb_video;";

    std::unique_lock<std::mutex> lock(_mutex);
    int ret = mysql_query(_mysql, sql.c_str());

    if(ret != 0) {
        std::cerr << "TableVideo::DeleteAll failed! Error: " << mysql_error(_mysql) << std::endl;
        return false;
    }
    return true;
}

}